home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 52 / Amiga Format AFCD52 (Issue 136, May 2000).iso / -serious- / workbench / directoryopus4 / dopus4_src / dopus_print / print.c < prev    next >
C/C++ Source or Header  |  2000-03-11  |  10KB  |  362 lines

  1. /*
  2.  
  3. Directory Opus 4
  4. Original GPL release version 4.12
  5. Copyright 1993-2000 Jonathan Potter
  6.  
  7. This program is free software; you can redistribute it and/or
  8. modify it under the terms of the GNU General Public License
  9. as published by the Free Software Foundation; either version 2
  10. of the License, or (at your option) any later version.
  11.  
  12. This program is distributed in the hope that it will be useful,
  13. but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. GNU General Public License for more details.
  16.  
  17. You should have received a copy of the GNU General Public License
  18. along with this program; if not, write to the Free Software
  19. Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  20.  
  21. All users of Directory Opus 4 (including versions distributed
  22. under the GPL) are entitled to upgrade to the latest version of
  23. Directory Opus version 5 at a reduced price. Please see
  24. http://www.gpsoft.com.au for more information.
  25.  
  26. The release of Directory Opus 4 under the GPL in NO WAY affects
  27. the existing commercial status of Directory Opus 5.
  28.  
  29. */
  30.  
  31. #include "print.h"
  32.  
  33. void get_vis_info(struct VisInfo *vis,char *portname);
  34.  
  35. void main(argc,argv)
  36. int argc;
  37. char *argv[];
  38. {
  39.     struct VisInfo vis;
  40.     char **dummy_args,*port=NULL,*stringname;
  41.     struct DOpusArgsList *arglist=NULL;
  42.     BPTR oldcurdir,*dirlocks;
  43.     int arg,printdir=0,pdwind=-1;
  44.     struct StringData *stringdata;
  45.     struct DOpusRemember *memkey=NULL;
  46.  
  47.     if (!(DOpusBase=(struct DOpusBase *)OpenLibrary("dopus.library",18)))
  48.         exit(0);
  49.  
  50.     if ((dummy_args=LAllocRemember(&memkey,16*sizeof(char *),MEMF_CLEAR)) &&
  51.         (dirlocks=LAllocRemember(&memkey,16*sizeof(BPTR),MEMF_CLEAR)) &&
  52.         (stringname=LAllocRemember(&memkey,80,0)) &&
  53.         (stringdata=LAllocRemember(&memkey,sizeof(struct StringData),MEMF_CLEAR))) {
  54.  
  55.         if (argc==0) {
  56.             struct WBStartup *startup;
  57.             int arg;
  58.  
  59.             startup=(struct WBStartup *)argv;
  60.             for (arg=0;arg<startup->sm_NumArgs && arg<16;arg++) {
  61.                 dummy_args[arg]=startup->sm_ArgList[arg].wa_Name;
  62.                 dirlocks[arg]=startup->sm_ArgList[arg].wa_Lock;
  63.                 ++argc;
  64.             }
  65.             argv=dummy_args;
  66.         }
  67.  
  68.         IntuitionBase=DOpusBase->IntuitionBase;
  69.         GfxBase=DOpusBase->GfxBase;
  70.  
  71.         WorkbenchBase=OpenLibrary("workbench.library",0);
  72.         PPBase=OpenLibrary("powerpacker.library",0);
  73.  
  74.         for (arg=1;arg<argc;arg++) {
  75.             if (argv[arg][0]=='&') port=&argv[arg][1];
  76.             else if (argv[arg][0]=='!') arglist=(struct DOpusArgsList *)atoi(&argv[arg][1]);
  77.             else if (argv[arg][0]=='@') {
  78.                 printdir=1;
  79.                 if (argv[arg][1]=='0') pdwind=0;
  80.                 else if (argv[arg][1]=='1') pdwind=1;
  81.             }
  82.             else break;
  83.         }
  84.  
  85.         get_vis_info(&vis,port);
  86.  
  87.         stringdata->default_table=default_strings;
  88.         stringdata->string_count=STR_STRING_COUNT;
  89.         stringdata->min_version=STRING_VERSION;
  90.  
  91.         if (vis.vi_language)
  92.             lsprintf(stringname,"DOpus:Modules/S/DM_Print_%s.STR",vis.vi_language);
  93.         else stringname[0]=0;
  94.  
  95.         if (ReadStringFile(stringdata,stringname)) {
  96.             string_table=stringdata->string_table;
  97.  
  98.             if (printdir && port) do_printdir(&vis,port,pdwind);
  99.             else {
  100.                 if (!arglist) port=NULL;
  101.                 if (dirlocks[arg]) oldcurdir=CurrentDir(dirlocks[arg]);
  102.                 do_print(&vis,port,arglist,argc-arg,&argv[arg]);
  103.                 if (dirlocks[arg]) CurrentDir(oldcurdir);
  104.             }
  105.         }
  106.         FreeStringFile(stringdata);
  107.  
  108.         if (WorkbenchBase) CloseLibrary(WorkbenchBase);
  109.         if (PPBase) CloseLibrary(PPBase);
  110.     }
  111.     LFreeRemember(&memkey);
  112.     CloseLibrary((struct Library *)DOpusBase);
  113. #ifdef __SASC_60
  114.     __exit(0);
  115. #else
  116.     _exit(0);
  117. #endif
  118. }
  119.  
  120. void get_vis_info(vis,portname)
  121. struct VisInfo *vis;
  122. char *portname;
  123. {
  124.     vis->vi_fg=1; vis->vi_bg=0;
  125.     vis->vi_shine=2; vis->vi_shadow=1;
  126.     vis->vi_font=NULL;
  127.     vis->vi_screen=NULL;
  128.     vis->vi_stringcol[0]=1; vis->vi_stringcol[1]=0;
  129.     vis->vi_activestringcol[0]=1; vis->vi_activestringcol[1]=0;
  130.     vis->vi_flags=VISF_WINDOW;
  131.     vis->vi_language=NULL;
  132.  
  133.     if (dopus_message(DOPUSMSG_GETVIS,(APTR)vis,portname)) return;
  134.  
  135.     if (IntuitionBase->LibNode.lib_Version>35) {
  136.         struct DrawInfo *drinfo;
  137.         struct Screen *pub;
  138.  
  139.         if (pub=LockPubScreen(NULL)) {
  140.             drinfo=GetScreenDrawInfo(pub);
  141.             vis->vi_shine=drinfo->dri_Pens[SHINEPEN];
  142.             vis->vi_shadow=drinfo->dri_Pens[SHADOWPEN];
  143.             vis->vi_fg=drinfo->dri_Pens[TEXTPEN];
  144.             vis->vi_bg=drinfo->dri_Pens[BACKGROUNDPEN];
  145.             FreeScreenDrawInfo(pub,drinfo);
  146.             UnlockPubScreen(NULL,pub);
  147.         }
  148.     }
  149. }
  150.  
  151. dopus_message(cmd,data,portname)
  152. int cmd;
  153. APTR data;
  154. char *portname;
  155. {
  156.     struct MsgPort *port,*replyport;
  157.     struct DOpusMessage msg;
  158.  
  159.     Forbid();
  160.     if (portname && portname[0] &&
  161.         (port=FindPort(portname)) &&
  162.         (replyport=LCreatePort(NULL,0))) {
  163.         msg.msg.mn_Node.ln_Type=NT_MESSAGE;
  164.         msg.msg.mn_Node.ln_Name=NULL;
  165.         msg.msg.mn_ReplyPort=replyport;
  166.         msg.msg.mn_Length=(UWORD)sizeof(struct DOpusMessage);
  167.         msg.command=cmd;
  168.         msg.data=data;
  169.         PutMsg(port,(struct Message *)&msg);
  170.         Permit();
  171.         WaitPort(replyport);
  172.         GetMsg(replyport);
  173.         LDeletePort(replyport);
  174.         return(1);
  175.     }
  176.     Permit();
  177.     return(0);
  178. }
  179.  
  180. void fill_out_req(req,vis)
  181. struct RequesterBase *req;
  182. struct VisInfo *vis;
  183. {
  184.     req->rb_fg=vis->vi_fg;
  185.     req->rb_bg=vis->vi_bg;
  186.     req->rb_shine=vis->vi_shine;
  187.     req->rb_shadow=vis->vi_shadow;
  188.     req->rb_font=vis->vi_font;
  189.     req->rb_flags&=~RBF_WINDOWCENTER;
  190.     if (vis->vi_screen) {
  191.         if (vis->vi_flags&VISF_WINDOW) {
  192.             req->rb_screen=((struct Window *)vis->vi_screen)->WScreen;
  193.             req->rb_window=(struct Window *)vis->vi_screen;
  194.             req->rb_flags|=RBF_WINDOWCENTER;
  195.         }
  196.         else req->rb_screen=vis->vi_screen;
  197.     }
  198.     else req->rb_screen=NULL;
  199. }
  200.  
  201. struct Gadget *addreqgadgets(reqbase,gadgets,gadgetlist)
  202. struct RequesterBase *reqbase;
  203. struct TagItem **gadgets;
  204. struct Gadget **gadgetlist;
  205. {
  206.     int gad;
  207.     struct Gadget *gadget=NULL,*newgadget,*firstgadget;
  208.  
  209.     for (gad=0;;gad++) {
  210.         if (!gadgets[gad]) break;
  211.         if (!(newgadget=(struct Gadget *)
  212.             AddRequesterObject(reqbase,gadgets[gad]))) return(NULL);
  213.         if (gadget) gadget->NextGadget=newgadget;
  214.         else firstgadget=newgadget;
  215.         gadget=newgadget;
  216.         gadgetlist[gad]=newgadget;
  217.     }
  218.     AddGadgets(reqbase->rb_window,firstgadget,NULL,gad,reqbase->rb_shine,reqbase->rb_shadow,1);
  219.     return(firstgadget);
  220. }
  221.  
  222. void border_text(reqbase,border,infobuf)
  223. struct RequesterBase *reqbase;
  224. Object_Border *border;
  225. char *infobuf;
  226. {
  227.     struct RastPort *rp;
  228.  
  229.     rp=reqbase->rb_window->RPort;
  230.     SetAPen(rp,reqbase->rb_bg);
  231.     RectFill(rp,border->ob_left,border->ob_top,
  232.         border->ob_left+border->ob_width-1,border->ob_top+border->ob_height-1);
  233.     SetAPen(rp,reqbase->rb_fg);
  234.  
  235.     if (infobuf) {
  236.         ObjectText(reqbase,
  237.             border->ob_left,
  238.             border->ob_top,
  239.             border->ob_width,
  240.             border->ob_height,
  241.             infobuf,
  242.             TEXTPOS_CENTER);
  243.     }
  244. }
  245.  
  246. void set_print_env(printdata)
  247. PrintData *printdata;
  248. {
  249.     int file;
  250.  
  251.     if (!(file=Open("env:DOpus_print.prefs",MODE_NEWFILE))) return;
  252.     Write(file,(char *)printdata,sizeof(PrintData));
  253.     Close(file);
  254. }
  255.  
  256. void get_print_env(printdata)
  257. PrintData *printdata;
  258. {
  259.     int file;
  260.  
  261.     if (!(file=Open("env:DOpus_print.prefs",MODE_OLDFILE))) return;
  262.     Read(file,(char *)printdata,sizeof(PrintData));
  263.     Close(file);
  264. }
  265.  
  266. void activate_next_gadget(gadget,window)
  267. struct Gadget *gadget;
  268. struct Window *window;
  269. {
  270.     struct Gadget *gad;
  271.     int try;
  272.  
  273.     gad=gadget->NextGadget;
  274.     for (try=0;try<2;try++) {
  275.         while (gad) {
  276.             if (gad->GadgetType==GTYP_STRGADGET && !(gad->Flags&GFLG_DISABLED)) {
  277.                 ActivateStrGad(gad,window);
  278.                 return;
  279.             }
  280.             gad=gad->NextGadget;
  281.         }
  282.         gad=window->FirstGadget;
  283.     }
  284. }
  285.  
  286. get_file_byrequest(gadget,window,save)
  287. struct Gadget *gadget;
  288. struct Window *window;
  289. int save;
  290. {
  291.     struct DOpusFileReq filereq;
  292.     char dirbuf[256],filebuf[32],*ptr,*path;
  293.  
  294.     path=((struct StringInfo *)gadget->SpecialInfo)->Buffer;
  295.  
  296.     filereq.title=string_table[STR_SELECT_FILE];
  297.     filereq.dirbuf=dirbuf;
  298.     filereq.filebuf=filebuf;
  299.     filereq.window=window;
  300.     filereq.x=-2;
  301.     filereq.y=-2;
  302.     filereq.lines=15;
  303.     filereq.flags=(save)?DFRF_SAVE:0;
  304.     filereq.filearraykey=NULL;
  305.     filereq.filearray=NULL;
  306.  
  307.     strcpy(dirbuf,path);
  308.     if ((ptr=BaseName(dirbuf))>dirbuf) {
  309.         strcpy(filebuf,ptr);
  310.         *ptr=0;
  311.     }
  312.     else if (ptr==dirbuf) {
  313.         dirbuf[0]=0;
  314.         strcpy(filebuf,path);
  315.     }
  316.     else filebuf[0]=0;
  317.  
  318.     if (!(FileRequest(&filereq)) || !filebuf[0]) return(0);
  319.  
  320.     strcpy(path,dirbuf);
  321.     TackOn(path,filebuf,256);
  322.     RefreshStrGad(gadget,window);
  323.     return(1);
  324. }
  325.  
  326. int error_rets[2]={1,0};
  327.  
  328. check_error(reqbase,str,abort)
  329. struct RequesterBase *reqbase;
  330. char *str;
  331. int abort;
  332. {
  333.     struct DOpusSimpleRequest *req;
  334.     char *error_gads[3];
  335.     int ret;
  336.  
  337.     if (!(req=AllocMem(sizeof(struct DOpusSimpleRequest),MEMF_CLEAR))) return(0);
  338.     req->text=str;
  339.     if (abort) {
  340.         error_gads[0]=string_table[STR_ABORT];
  341.         error_gads[1]=string_table[STR_CONTINUE];
  342.     }
  343.     else {
  344.         error_gads[0]=string_table[STR_OKAY];
  345.         error_gads[1]=string_table[STR_CANCEL];
  346.     }
  347.     error_gads[2]=NULL;
  348.     req->gads=error_gads;
  349.     req->rets=error_rets;
  350.     req->hi=reqbase->rb_shine;
  351.     req->lo=reqbase->rb_shadow;
  352.     req->fg=reqbase->rb_fg;
  353.     req->bg=reqbase->rb_bg;
  354.     req->font=reqbase->rb_font;
  355.     req->flags=SRF_RECESSHI;
  356.     if (reqbase->rb_flags&RBF_BORDERS) req->flags|=SRF_BORDERS;
  357.     req->title="DOpus_Print";
  358.     ret=DoSimpleRequest(reqbase->rb_window,req);
  359.     FreeMem(req,sizeof(struct DOpusSimpleRequest));
  360.     return(ret);
  361. }
  362.